package com.hxm.appGenealogy.config.aop;

import com.alibaba.fastjson.JSON;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
@Slf4j
@Aspect
@Component
public class BeforeAop {

    /**
     * 切入点;
     * @Pointcut 切入点，其中execution用于使用切面的连接点。使用方法：execution(方法修饰符(可选) 返回类型 方法名 参数 异常模式(可选)) ，
     * 可以使用通配符匹配字符，*可以匹配任意字符。
     */
    @Pointcut("execution(public * com.hxm.appGenealogy.controller.FamliyController.*(..))")
    public void beForfAspect(){
    }


    @Around(value = "beForfAspect()")
    public Object webLogAround(ProceedingJoinPoint joinPoint) throws Throwable {
        // className的值：com.gongj.test.controller.UserController
        String className = joinPoint.getTarget().getClass().getName();
        MethodSignature signature = (MethodSignature)joinPoint.getSignature();
        // 方法名称示例：test.controller.UserController.getUser():
        String methodName = new StringBuffer(className.replaceFirst("test.", ""))
                .append(".")
                .append(signature.getMethod().getName())
                .append("():").toString();
        log.info("==========> {} 方法原始报文:{}",methodName, JSON.toJSONString(joinPoint.getArgs()));
        Object proceed = joinPoint.proceed();
        log.info("==========> {} 方法响应报文:{}",methodName,JSON.toJSONString(proceed));
        return proceed;
    }
}
